2018.8.9
基础
1 | ## 配置信息 |
node多版本控制
mac/lunix: nvm
windows: nvm-windows
n
windows nvm use xxx
报错:node vv16.15.0 (64-bit) is not installed or cannot be found.
解决:cmd用管理员身份打开执行。
PS: 安装的时候会指定NVM_SYMLINK变量(nodejs),use的时候会创建一个软连接。
<!–
卸载nodejs不重要。use 的时候,会覆盖掉吧。
但是nrm 没有删除掉,install的时候报错。所以去用户目录下把.nrmrc 文件删掉了。
把之前重复设置的nodejs 环境变量也删掉了;现在是NVM_SYMLINK变量,会添加到环境变量PATH中。
原始.npmrc 配置1
2
3
4electron_mirror=https://npm.taobao.org/mirrors/electron/
registry=https://registry.npmjs.org/
//registry.npmjs.org/:_authToken=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
home=https://npm.taobao.org
–>
nvm 配置在nvm安装目录下settings.txt。可以设置源。1
2
3
4
5root: D:\Program Files\nvm
path: D:\Program Files\nodejs
node_mirror: https://npm.taobao.org/mirrors/node/
npm_mirror: https://npm.taobao.org/mirrors/npm/
改变全局模块/缓存路劲
# 安装npm cnpm踩坑记录
## 3. 改变原有的环境变量(配置npm的全局模块的存放路径以及cache的路径)
(1)先在C:\Program Files\nodejs目录下新建”global”和”cache”两个文件夹
(2)输入以下命令改变npm配置
npm config set prefix “C:\Program Files\nodejs\global”
npm config set cache “C:\Program Files\nodejs\cache”
## 4.配置环境变量
(1)我的电脑右键点击属性进入该页面—点击高级系统设置—点击环境变量进入该页面
(2)修改用户变量PATH:把”C:\Program Files\nodejs\global”加到后面,用分号隔开。
(3)新增系统变量NODE_PATH:设置成“C:\Program Files\nodejs\node_global\node_modules”。
tip:由于前面已经更改了原有的环境变量,所以安装cnmp时会自己安装到C:\Program Files\nodejs\global\node_modules目录下面,所以cnpm的环境变量也许要更改(如下步骤很重要)
(4)修改系统变量path:把“C:\Program Files\nodejs\global\node_modules\cnpm“加到后面
## 5.安装cnmp
安装命令:npm install -g cnpm –registry=https://registry.npm.taobao.org
## 6.cmd检测是否安装成功(cnpm -v),如下就算成功
设置cnpm
# npm的设置cnpm
淘宝 npm 地址: http://npm.taobao.org/
如何使用
有很多方法来配置npm的registry地址,下面根据不同情境列出几种比较常用的方法。以淘宝npm镜像安装express举例:
## 1.临时使用
npm –registry https://registry.npm.taobao.org install express
## 2.持久使用
npm config set registry https://registry.npm.taobao.org
// 配置后可通过下面方式来验证是否成功
npm config get registry
// 或
npm info express
## 3.通过cnpm使用
npm install -g cnpm –registry=https://registry.npm.taobao.org
// 使用
cnpm install express
## 4.关闭npm的https
npm config set strict-ssl false
设置镜像
这个也是网上搜的,亲自试过,非常好用!
镜像使用方法(三种办法任意一种都能解决问题,建议使用第三种,将配置写死,下次用的时候配置还在):
## 1.通过config命令
npm config set registry https://registry.npm.taobao.org
npm info underscore (如果上面配置正确这个命令会有字符串response)
## 2.命令行指定
npm –registry https://registry.npm.taobao.org info underscore
## 3.编辑 ~/.npmrc 加入下面内容
registry = https://registry.npm.taobao.org
搜索镜像: https://npm.taobao.org
建立或使用镜像,参考: https://github.com/cnpm/cnpmjs.org
nrm
nrm(npm registry manager )是npm的镜像源管理工具,有时候国外资源太慢,使用这个就可以快速地在 npm 源间切换npm install -g nrm
1
2
3nrm ls
nrm add xx https://registry.x.com
nrm use xx
# npm 安装 electron 超时
在用户目录的 .npmrc 文件里添加一行
electron_mirror=https://npm.taobao.org/mirrors/electron/
指定 Electron 二进制文件的国内镜像(上面路径里最后一个正斜杠 “/“ 别丢了)。
为Npm设代理
为npm更换镜像后,我在公司安装npm包还是链接超时。后来在同事的提醒下,知道公司所有的网络链接都要通过公司代理服务器的。所以尝试着为npm设置了下proxy,设置方法如下:
第一个是http,第二个是https
npm config set proxy http://proxy.company.com
npm config set https-proxy http://proxy.company.com
上面proxy代理地址可根据你公司电脑ie里默认设置的代理服务器来填写。如ie里没有设置代理服务器,那么就需要知道公司的代理服务器地址。
通过为npm设置公司代理服务器的方式,npm终于能顺利连接了。
NPM查看包的版本信息
查看npmjs服务器上的包的版本信息
npm view pkg version
查看服务器上包pkg的最新的版本信息
npm view gulp version # 4.0.0
npm view pgk versions
查看npmjs服务器上包pkg的所有的版本信息
npm view gulp versions
npm info pkg
查看npmjs服务器上包pkg的最新的版本信息,和npm view pkg version的功能类似,但比npm view pkg version提供的信息更丰富
npm info gulp
查看本地安装包的版本信息
npm ls pkg
查看某个项目下包pkg的版本信息,注意该命令需要在某个项目下执行
npm ls webpack
webapp_backend@1.0.0 /本地的项目路径
└── webpack@3.12.0
npm ls pkg -g
查看本地全局安装的pkg版本
npm ls webpack -g
/Users/mac/.nvm/versions/node/v8.8.0/lib
└── webpack@4.29.6
版本号
#31 npm 版本号
npm版本号遵循semver规范。版本号格式为major.minor.patch。其中major、minor、patch必须是非0的开头的非负数。
此外,版本号还可以带上预发布和build metadata。
版本号的扩展
#### 预发布
在patch后加上”-“和一串由”.”连接的标识符。格式为major.minor.patch-{identifier}.{identifier}.{identifier}
。
identifier必须是数字、大小写字母或连字符组成的非空字符串。比如:1.0.3-alpha.1
#### build metadata
在patch或预发布后面加上”+”和一串由”.”连接的标识符。格式为major.minor.patch+{identifier}.{identifier}.{identifier}
或者 major.minor.patch{pre-release}+{identifier}.{identifier}.{identifier}
。如:1.0.3-alpha.1+001,1.0.0-beta+exp.sha.5114f85
版本号大小比较
版本号大小比较是从左到右依次比较major、minor、patch、pre-release。 build-metadata对优先级无影响 。预发布版本优先级低于正式版本
安装semver工具测一测npm install --save semver
semver规范
版本运算符
版本运算符指定了一定范围的版本。
主要有~、^、-、<、<=、>、>=、=版本运算符。
~ 版本号 —– 指定主版本号或者次版本号相同
^ 版本号 — 第一个非零 版本号相同
<!–
兼容某个版本
版本号中最左边的非0数字的右侧可以任意
如果缺少某个版本号,则这个版本号的位置可以任意 如:^1.1.2 ,表示>=1.1.2 <2.0.0,可以是1.1.2,1.1.3,…,1.1.n,1.2.n,…,1.n.n
如:^0.2.3 ,表示>=0.2.3 <0.3.0,可以是0.2.3,0.2.4,…,0.2.n
如:^0.0,表示 >=0.0.0 <0.1.0,可以是0.0.0,0.0.1,…,0.0.n
–>
~ vs ^: 同一个版本号,^ 能匹配的范围大些,更加激进。
- 指定精确范围
分组 ||: npm i vue@"^0.7 || ~2" # 安装 2.6.10
x的位置表示任意版本
标识符 任意版本
“”(空字符串) 匹配任何版本,和一样
版本号变更规则
- 版本号只升不降,不得在数字前加0,比如 2.01.2 不允许的;
- 0.y.z,处于开发阶段的版本;
- 第一个正式版版本往往命名为 1.0.0;
- 先行版本必须在补丁版本之后添加,比如 2.3.7-0,0表示先行版本,和补丁版本用-分隔;
- 版本的比较依次比较主版本→次版本→补丁版本→先行版本,直到第一个能得出比较结果为止;
- 不小心把一个不兼容的改版当成了次版本号发行了该怎么办?一旦发现自己破坏了语义化版本控制的规范,就要修正这个问题,并发行一个新的次版本号来更正这个问题并且恢复向下兼容。即使是这种情况,也不能去修改已发行的版本。
npm version
git 和 npm version 结合
手动更改版本号
执行 npm version <version> -m 'xx %s xx'
改变npm版本的同时,会执行一次 git commt -m ‘xx %s xx’并用版本号打一个tag,%s 会替换成版本号,前提是版本库是干净的(clean)。
自动更新版本
在 .git/hooks目录内,新建post-commit,输入以下内容:1
2
3
4
5
6
7
COMMIT_MSG="$(git log --pretty=format:"%s" -1 head)"
echo "$COMMIT_MSG" | grep -q "^[0-9]"
if [ $? -ne 0 ];then
# 自动修改 patch
echo $(npm version patch)
fi
tag
常用的版本号标签有latest(默认),alpha(内测), beta (公测), next(下一个), rc( 候选), experimental(实验)。
给版本号添加标签的方式有两种。一种是在发布时指定标签,如npm publish --tag alpha
。另一个种是发布后执行命令npm dist-tag add your-npm-package@1.0.2-1 alpha
。
一般不要通过npm unpublsh -f
删除发布的包
可以通过设置tag的方式去及时更新
npm tag
发布测试包,不希望检测更新,或避免用户安装测试包。
不小心把测试版发布成了正式版,我该怎么办?只能跑路了吗?
version:
发布到npm后,每一个版本号都对应了其资源文件,而且是不可修改的。npm中的版本号类似于git中的tag。
tag:
一般情况下,我们可以不指定tag,这时默认就会用latest这个tag,所有发布或者安装都是最新的正式版。
而指定tag之后,我们可以在这个tag上发布一个更新的版本,用户安装的时候如果也指定这个tag,则会安装这个tag下的最新版。
1 | # 查看当前的tag和对应的version。 |
npm发包
发包时机脚本
可以通过设置prepublish在发布前执行脚本
对于以下脚本,npm 支持 package.json 文件的“scripts”属性:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18prepublish:在包打包和发布之前运行,以及在npm install没有任何参数的本地运行。(见下文)
prepare:在打包和发布包之前运行,在npm install没有任何参数的本地运行(见下文)。这是在之后运行prepublish,但是之前prepublishOnly。
prepublishOnly:在准备和包装之前运行,仅打开npm publish。(见下文。)
prepack:前运行压缩包包装(上npm pack,npm publish并安装git的依赖时)
postpack:在生成tarball之后运行并移动到其最终目标。
publish,postpublish:发布包后运行。
preinstall:在安装软件包之前运行
install,postinstall:安装软件包后运行。
preuninstall,uninstall:在卸载软件包之前运行。
postuninstall:在卸载软件包后运行。
preversion:在碰撞包版本之前运行。
version:运行AFTER碰撞包版本,但提交之前。
postversion:运行AFTER碰撞包版本,然后提交。
pretest,test,posttest:由npm test命令运行。
prestop,stop,poststop:由npm stop命令运行。
prestart,start,poststart:由npm start命令运行。
prerestart,restart,postrestart:按npm restart命令运行。注意:npm restart如果没有restart提供脚本,将运行停止和启动脚本。
preshrinkwrap,shrinkwrap,postshrinkwrap:由npm shrinkwrap命令运行。
此外,可以通过运行执行任意脚本npm run-script <stage>
。前置和后名称匹配的命令将这些运行以及(例如premyscript,myscript, postmyscript)。可以运行依赖项的脚本npm explore <pkg> -- npm run <stage>
。
忽略文件
方法一:使用 .gitignore 设置忽略哪些文件
方法二:使用 .npmignore设置忽略哪些文件
.npmignore的写法跟.gitignore 的规则完全一样。
若同时使用了.npmignore和.gitignore,只有.npmignore会生效,优先级比较高。
方法三:使用package.json的files字段选择发布哪些文件
直接在package.json中files字段设置发布哪些文件或目录。
这个优先级高于.npmignore和.gitignore。
1 | # 默认被忽略: |
发布版本
npm version
3.1 发布稳定版本
更新版本号共有以下选项(major | minor | patch | premajor | preminor | prepatch | prerelease) ,注意项目的git status 必须是clear,才能使用这些命令。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# major 主版本号,并且不向下兼容 1.0.0 -> 2.0.0
$ npm version major
# minor 次版本号,有新功能且向下兼容 1.0.0 -> 1.1.0
$ npm version minor
# patch 修订号,修复一些问题、优化等 1.0.0 -> 1.0.1
$ npm version patch
# premajor 预备主版本 1.0.0 -> 2.0.0-0
$ npm version premajor
# preminor 预备次版本 1.0.0 -> 1.1.0-0
$ npm version preminor
# prepatch 预备修订号版本 1.0.0 -> 1.0.1-0
$ npm version prepatch
# prerelease 预发布版本 1.0.0 -> 1.0.0-0
$ npm version prerelease
版本号更新后,我们就可以进行版本的发布npm publish
3.2 预发布版本
很多时候一些新改动,并不能直接发布到稳定版本上(稳定版本的意思就是使用 npm install demo 即可下载的最新版本),这时可以发布一个 “预发布版本“,不会影响到稳定版本。1
2
3# 发布一个 prelease 版本,tag=beta
$ npm version prerelease
$ npm publish --tag beta
比如原来的版本号是 1.0.1,那么以上发布后的版本是 1.0.1-0,用户可以通过 npm install demo@beta 或者 npm install demo@1.0.1-0 来安装,用户通过 npm install demo 安装的还是 1.0.1 版本。
3.3、将 beta 版本设置为稳定版本
1 | # 首先可以查看当前所有的最新版本,包括 prerelease 与稳定版本 |
这时候,latest 稳定版本已经是 1.0.1-1 了,用户可以直接通过 npm install demo 即可安装该版本。
3.4、将 beta 版本移除
1 | # 将 beta 版本移除 |
自己实现的一个发包脚本
发包异常
- Error: 402 Payment Required
换了个名字,想起了自己见过的库,就模仿加了个 @ 前缀的包,再次发布的时候,报了下面的错误:Error: 402 Payment Required - PUT https://registry.npmjs.org/@xx/xx - You must sign up for private packages
查看文档,发现 @npm/package-name 这种形式的包名,是有作用域的包名形式,执行 npm publish 的时候默认是发布私有的包。因此,第一种方式是花钱买私有包的服务,另外一种方式就是指定参数,表示公开:npm publish --access public
需要注意的是这种形式的包名跟 npm 账户有对应关系,不能随便填写。npm init --scope=@my-org
这种形式表示是一个组织,my-org 对应是 npm 中的组织名。
npm init --scope=@my-username
install和update区别
1 | { |
总结: 两者最大的区别是在对待已经安装过的模糊版本时候
npm install会忽略模糊版本
npm update会更新模糊版本至最新
另外: install and update 处理 devDependencies 方式也不同
npm install 会安装/更新devDependencies,除非你指定 –production标志
npm update 会忽略 devDependencies,除非你指定 –dev 标志
包权限管理
很多时候,一个项目包往往不只是你一个人在管理的,这时需要给其他一起维护的同学开通发布的权限,相关使用命令如下:1
2
3
4
5
6
7
8# 查看模块 owner, 其中 demo 为模块名称
$ npm owner ls demo
# 添加一个发布者, 其中 xxx 为要添加同学的 npm 账号
$ npm owner add xxx demo
# 删除一个发布者
$ npm owner rm xxx demo
安装npm包
windows 安装node-sass
使用node-sass模块,npm install安装一直失败,尝试了很多方法,最终找到了这个方法,简直棒极了!
两种方法:
第一种:
1.先检查项目的node_modules文件夹是否存在node-sass文件夹,存在,删掉,不存在,执行第二步;
2.打开cmd,在项目根目录下输入以下代码npm install node-sass --sass-binary-site=http://npm.taobao.org/mirrors/node-sass
或SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/ npm install node-sass
set SASS_BINARY_SITE=https://npm.taobao.org/mirrors/node-sass/
或者
在你的project下创建一个 .npmrc 文件
在文件中添加 sass_binary_site=https://npm.taobao.org/mirrors/node-sass/
第二种:
进入项目的node_modules目录下;
2.使用git克隆node-sass源码:Git路径为:git clone https://github.com/sass/node-sass.git
3.使用编辑器,进入node_modules/node-sass/package.json文件中;
4.使用编辑器,将package.json文件中nodeSassConfig>binarySite的值修改为淘宝镜像地址;
5.在cmd进入node-sass文件夹中,执行以下命令:npm install
即可等待node-sass安装成功
node-sass -v
node-sass::gyp ERR! build error
c++编译异常问题。
1 | // 只是一下verbose。会安装成功 |
- check your node-sass version in your package.json and compare with the following table:
NodeJS | Supported node-sass version | Node Module
– | – | –
Node 16 | 6.0+ | 93
Node 15 | 5.0+ | 88
Node 14 | 4.14+ | 83
Node 13 | 4.13+, <5.0 | 79
Node 12 | 4.12+ | 72
Node 11 | 4.10+, <5.0 | 67
Node 10 | 4.9+, <6.0 | 64
Node 8 | 4.5.3+, <5.0 | 57
Node <8 | <5.0 | <57
<!– 3. install the Nodejs version according with your node-sass - clean old node_modules with: rm -rf node_modules
- run: npm install –>
node-gyp 问题
Err: sh -c node-pre-gyp install --fallback-to-build
Err: binding.gyp not found (xxx/xxx/xxx) while trying to load binding.gyp
执行:npm install -g node-gyp
, 卸载后重新安装.然后再进行npm install
。
一般是安装npm包回遇到问题,比如:canvas,ccap图形验证码1
2
3
4
5
6
7
8npm cache verify
npm uninstall -g node-gyp
npm uninstall node-gyp
sudo npm install -g node-gyp@3.4.0 --save
npm install -g canvas
# npm i -g node-gyp@latest && npm config set node_gyp "/usr/local/lib/node_modules/node-gyp/bin/node-gyp.js"
node-canvas
Err: pkg-config: command not found
1
brew install pkg-config cairo pango libpng jpeg giflib librsvg
electron安装
在你的npmrc文件里添加淘宝npm源,Windows用户可以参考下面的路径:1
2registry=https://registry.npm.taobao.org/
ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/
也可以使用下面命令:ELECTRON_MIRROR=https://npm.taobao.org/mirrors/electron/ npm install --save-dev electron
peer deps
peer react@"^16.0.0-0" from enzyme-adapter-react-16@1.15.6 npm ERR! node_modules/enzyme-adapter-react-16 npm ERR! dev enzyme-adapter-react-16@"^1.15.6" from the root project
Could not resolve dependency: npm ERR! peer react@"^16.0" from @react-native-community/masked-view@0.1.10
Please try again with the –legacy-peer-deps option.
The –legacy-peer-deps flag was introduced with v7 of npm as a way to bypass peerDependency auto-installation; it tells NPM to ignore peer deps and proceed with the installation anyway. This can cause some unwanted behavior and I would not suggest it.
npm安装出错
SSL Error: CERT_UNTRUSTED while using npm command
# 实际
通过安装n包,更新node成功了。之后出现问题是退出当前工作目录,重新进入就好了。(服务端同学,把工作目录全量更新了,然后npm命令就不可以执行了,不知道他全量更新做了什么)
# node npm install Error: CERT_UNTRUSTED
ssl验证问题,使用下面的命令取消ssl验证即可解决
npm config set strict-ssl false
错误error-code-ELIFECYCLE,执行如下命令
npm cache clear –force
npm install -g npm
# SSL Error: CERT_UNTRUSTED while using npm command
### 1
You can bypass https using below commands:npm config set strict-ssl false
or set the registry URL from https or http like below:npm config set registry="http://registry.npmjs.org/"
### 2
Update your node.js installation.The following commands should do it (from here):
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
-RPC failed,curl 18 transfer closed with outstanding read data remaining
项目太久,资源文件太大. $_PS: 最后也没有下载下来,换了一个仓库。
原因1:缓存区溢出。网上大部分解决措施:
git config –glob al http.postBuffer 524288000
可能原因2:网络下载速度缓慢
git config –global http.lowSpeedLimit 0
git config –global http.lowSpeedTime 999999
第三:如果依旧clone失败,则首先浅层clone,然后更新远程库到本地
git clone –depth=1 http://gitlab.xxx.cn/yyy/zzz.git
cd large-repository
git fetch –unshallow
其他方式,一般clone http方式的容易产生此问题,改成SSH的方式也有效,即https://改为git://
command not found
bash: vue: command not found
npm 全局路径不对或 node_modules 的路径未设置
三、查看npm全局路径:npm root -g
得出/usr/local/node/lib/node_modules,检查是否正确的路径。
若存在问题可重新指定:
npm config set prefix /usr/local
MSBUILD : error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”
错误原因:缺少windows构建插件;
全局安装windows构建工具,执行如下命令即可!npm install --global --production windows-build-tools
ERROR in Module build failed (from ./node_modules/sass-loader/lib/loader.js):
sass-loader 降低版本号